import axios from 'axios';
import Adapter from 'axios-mock-adapter';
import {
	get
} from 'lodash';
import cookies from '@/utils/util.cookies.js';
import {
	server_api_base
} from '../config/index.js';
import router from '@/router';
import Message from '../components/Message/index.js';
axios.defaults.baseURL = server_api_base;
/**
 * @description 创建请求实例
 */
function createService() {
	// 创建一个 axios 实例
	const service = axios.create();
	// 请求拦截
	service.interceptors.request.use(
		config => config,
		error => {
			// 发送失败
			console.log(error);
			return Promise.reject(error);
		}
	);
	// 响应拦截
	service.interceptors.response.use(
		response => {
			// dataAxios 是 axios 返回数据中的 data
			const dataAxios = response.data;
			// 这个状态码是和后端约定的
			const {
				code
			} = dataAxios;
			// 根据 code 进行判断
			if (code === undefined) {
				// 如果没有 code 代表这不是项目后端开发的接口 比如可能是 
				return dataAxios;
			} else {
				// 有 code 代表这是一个后端接口 可以进行进一步的判断
				switch (code) {
					case 0:
						// [ 示例 ] code === 0 代表没有错误
						return dataAxios.data;
						// case 'xxx':
						//   // [ 示例 ] 其它和后台约定的 code
						//   errorCreate(`[ code: xxx ] ${dataAxios.msg}: ${response.config.url}`)
						//   break
					default:
						// 不是正确的 code
						console.log(`${dataAxios.msg}: ${response.config.url}`);
						break;
				}
			}
		},
		error => {
			const status = get(error, 'response.status');
			switch (status) {
				case 400:
					error.message = '请求错误';
					break;
				case 401:
					error.message = '未授权，请登录';
					break;
				case 403:
					error.message = '拒绝访问';
					break;
				case 404:
					error.message = `请求地址出错: ${error.response.config.url}`;
					break;
				case 408:
					error.message = '请求超时';
					break;
				case 500:
					error.message = '服务器内部错误';
					break;
				case 501:
					error.message = '服务未实现';
					break;
				case 502:
					error.message = '网关错误';
					break;
				case 503:
					error.message = '服务不可用';
					break;
				case 504:
					error.message = '网关超时';
					break;
				case 505:
					error.message = 'HTTP版本不受支持';
					break;
				default:
					break;
			}
			return Promise.reject(error);
		}
	);
	return service;
}

function isEmptyStr(s) {
	if (s == undefined || s == null || s == '') {
		return true;
	}
	return false;
}
/**
 * @description 创建请求方法
 * @param {Object} service axios 实例
 */
function createRequestFunction(service, cancelTimeout) {

	return function(config) {
		var token = cookies.get('token');
		//不是生产环境
		// if (process.env.NODE_ENV != 'production' && isEmptyStr(token)) {
		// 	token = 'admin';
		// }
		// if (token == 'test') {
		// 	token = 'admin';
		// }
		var that = this;
		var flag = true;
		var request;
		if (cancelTimeout == true) {
			const configDefault = {
				headers: {
					Authorization: token,
					'Content-Type': get(config, 'headers.Content-Type', 'application/json')
				},
				baseURL: process.env.VUE_APP_API,
				data: {}
			};
			request = service(Object.assign(configDefault, config));
		} else {
			const configDefault = {
				headers: {
					Authorization: token,
					'Content-Type': get(config, 'headers.Content-Type', 'application/json')
				},
				timeout: 50000,
				baseURL: process.env.VUE_APP_API,
				data: {}
			};
			request = service(Object.assign(configDefault, config));
		}
		// await request.then(await function(response) {
		// 	//token的问题
		// 	// if (response.status == 3) {
		// 	// 	//打印登录信息已过期
		// 	// 		Message.warning(response.info);
		// 	// 	//3秒后跳转到登录页面
		// 	// 	setTimeout(function() {
		// 	// 		router.push({
		// 	// 			name: 'login'
		// 	// 		});
		// 	// 	}, 3000);
		// 	// }else{

		// 	// }
		// });


		return request;

	};
}

// 用于真实网络请求的实例和请求方法
export const service = createService();
export const requestWithNotTimeOut = createRequestFunction(service, true);
export const request = createRequestFunction(service,false);

// 用于模拟网络请求的实例和请求方法
export const serviceForMock = createService();
export const requestForMock = createRequestFunction(serviceForMock,false);

// 网络请求数据模拟工具
export const mock = new Adapter(serviceForMock);
